package com.dcms.util;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Color;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;

import net.coobird.thumbnailator.Thumbnails;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.web.multipart.MultipartFile;



/**
 * 文件操作类
 * @author WuJiaWei
 * @since 2017-02-11 18:45:03
 *
 */
public class FileUtil {

	/**
	 * 根据路径删除指定的目录或文件，无论存在与否
	 * @param sPath  要删除的目录或文件
	 * @return 删除成功返回 true，否则返回 false。
	 */
	public static boolean DeleteFolder(String sPath) {
		boolean flag = false;
		File file = new File(sPath);
		// 判断目录或文件是否存在
		if (!file.exists()) {  // 不存在返回 false
			return flag;
		} else {
			// 判断是否为文件
			if (file.isFile()) {  // 为文件时调用删除文件方法
				return deleteFile(sPath);
			} else {  // 为目录时调用删除目录方法
				return deleteDirectory(sPath);
			}
		}
	}

	/**
	 * 删除单个文件
	 * @param   sPath    被删除文件的文件名
	 * @return 单个文件删除成功返回true，否则返回false
	 */
	public static boolean deleteFile(String sPath) {
		boolean flag = false;
		File file = new File(sPath);
		// 路径为文件且不为空则进行删除
		if (file.isFile() && file.exists()) {
			file.delete();
			flag = true;
		}
		return flag;
	}

	/**
	 * 删除目录以及目录下的文件
	 * @param  sPath 被删除目录的文件路径
	 * @return  目录删除成功返回true，否则返回false
	 */
	public static boolean deleteDirectory(String sPath) {
		//如果sPath不以文件分隔符结尾，自动添加文件分隔符
		if (!sPath.endsWith(File.separator)) {
			sPath = sPath + File.separator;
		}
		File dirFile = new File(sPath);
		//如果dir对应的文件不存在，或者不是一个目录，则退出
		if (!dirFile.exists() || !dirFile.isDirectory()) {
			return false;
		}
		boolean flag = true;
		//删除文件夹下的所有文件(包括子目录)
		File[] files = dirFile.listFiles();
		for (int i = 0; i < files.length; i++) {
			//删除子文件
			if (files[i].isFile()) {
				flag = deleteFile(files[i].getAbsolutePath());
				if (!flag) break;
			} //删除子目录
			else {
				flag = deleteDirectory(files[i].getAbsolutePath());
				if (!flag) break;
			}
		}
		if (!flag) return false;
		//删除当前目录
		if (dirFile.delete()) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 检查图片类型
	 * @param fileType 文件类型：0-IMG,1-VIDEO,2-AUDIO
	 * @return
	 */
	public static boolean checkFileSuffix(Integer fileType,MultipartFile file) {
		//初始化
		String[] TYPES=new String[10];

		switch (fileType) {
			case 0:
				TYPES[0]=".jpg";
				TYPES[1]=".png";
				TYPES[2]=".bmp";
				TYPES[3]=".jpeg";
				TYPES[4]=".gif";
				break;
			case 1:	//AVI、MP4、3gp、3gp2等等 苹果系手机一般为MOV。
				TYPES[0]=".mp4";
				TYPES[1]=".rmvb";
				TYPES[2]=".3gp";
				TYPES[3]=".mov";
				TYPES[4]=".avi";
				break;
			case 2:
				TYPES[0]=".amr";
				TYPES[1]=".wav";
				TYPES[2]=".mp3";
				TYPES[3]=".awb";
				TYPES[4]=".wma";
				TYPES[5]=".ogg";
			default:
				break;
		}

		String origName=file.getOriginalFilename();// 文件原名称
		String type=origName.substring(origName.lastIndexOf(".")).toLowerCase();

		boolean isTypes=false;
		for (int i = 0; i < TYPES.length; i++) {
			if (TYPES!=null&&type.equals(TYPES[i])) {
				isTypes=true;
				break;
			}
		}

		return isTypes;
	}

	/**
	 * 上传图片
	 * @param request 请求
	 * @param path_deposit 存放位置(路径)
	 * @param file 文件
	 * @param isRandomName 是否随机名称
	 * @return 完整文件路径
	 */
	public static String uploadImage(HttpServletRequest request,String path_deposit,MultipartFile file,boolean isRandomName) {
		try {
			if(file!=null){
				String origName=file.getOriginalFilename();// 文件原名称
				String type=origName.substring(origName.lastIndexOf("."));
				type = type.toLowerCase();
				//存放图片文件的路径
				String path_deposit_new = path_deposit;
				String path=request.getSession().getServletContext().getRealPath(path_deposit_new);
				//组合名称
				String fileSrc="";
				//是否随机名称
				if(isRandomName){
					origName=UUID.randomUUID().toString().replaceAll("-", "")+type;
				}

				File targetFile = new File(path, origName);
				if(!targetFile.exists()){
					targetFile.mkdirs();//创建目录
				}
				//上传
				file.transferTo(targetFile);
				//新的路径
				fileSrc = path_deposit + origName;
				return fileSrc;
			}
			return null;
		}catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 生成随机文件名称
	 * @param file
	 * @return
	 */
	public static String  randomFileName(MultipartFile file) {
		String origName=file.getOriginalFilename();// 文件原名称
		String type=origName.substring(origName.lastIndexOf("."));
		String newName = origName=UUID.randomUUID().toString().replaceAll("-", "")+type;
		return newName;
	}

	/**
	 * 压缩图片大小，设置宽度，高度auto
	 * @param oldFilePath
	 * @param oldFileName
	 * @param width
	 * @throws IOException
	 */
	public static String thumbnail_w_h(String oldFilePath,String oldFileName, int width) throws IOException {
		File newFile = new File(oldFilePath+oldFileName);
		BufferedImage bi = ImageIO.read(newFile);
		double srcWidth = bi.getWidth(); // 源图宽度
		double srcHeight = bi.getHeight(); // 源图高度

		double scale = 1;

		if (width > 0) {
			scale = width / srcWidth;
		}

		return thumbnailImage(newFile, (int) (srcWidth * scale), (int) (srcHeight * scale));

	}

	/**
	 * 按照固定宽高原图压缩
	 *
	 * @param img
	 * @param width
	 * @param height
	 * @throws IOException
	 */
	private static String thumbnailImage(File img, int width, int height) throws IOException {
		BufferedImage BI = ImageIO.read(img);
		Image image = BI.getScaledInstance(width, height, Image.SCALE_SMOOTH);

		BufferedImage tag = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_RGB);
		Graphics g = tag.getGraphics();
		g.setColor(Color.RED);
		g.drawImage(image, 0, 0, null); // 绘制处理后的图
		g.dispose();

		//保存图片
		String targetFileName = img.getName().substring(0, img.getName().lastIndexOf("."))
				+ "!" + width + "^" +height + img.getName().substring(img.getName().indexOf("."));
		File targetFile = new File(img.getAbsolutePath() + targetFileName);
		ImageIO.write(tag, "JPEG",targetFile);
		return targetFileName;
	}

	/**
	 * 按照宽高裁剪
	 *
	 * @param srcImageFile
	 * @param destWidth
	 * @param destHeight
	 * @param out
	 */
	public static void cut_w_h(File srcImageFile, int destWidth,
							   int destHeight, OutputStream out) {
		cut_w_h(srcImageFile, 0, 0, destWidth, destHeight, out);
	}

	public static void cut_w_h(File srcImageFile, int x, int y, int destWidth,
							   int destHeight, OutputStream out) {
		try {
			Image img;
			ImageFilter cropFilter;
			// 读取源图像
			BufferedImage bi = ImageIO.read(srcImageFile);
			int srcWidth = bi.getWidth(); // 源图宽度
			int srcHeight = bi.getHeight(); // 源图高度

			if (srcWidth >= destWidth && srcHeight >= destHeight) {
				Image image = bi.getScaledInstance(srcWidth, srcHeight,
						Image.SCALE_DEFAULT);

				cropFilter = new CropImageFilter(x, y, destWidth, destHeight);
				img = Toolkit.getDefaultToolkit().createImage(
						new FilteredImageSource(image.getSource(), cropFilter));
				BufferedImage tag = new BufferedImage(destWidth, destHeight,
						BufferedImage.TYPE_INT_RGB);
				Graphics g = tag.getGraphics();
				g.drawImage(img, 0, 0, null); // 绘制截取后的图
				g.dispose();
				// 输出为文件
				ImageIO.write(tag, "JPEG", out);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
